package yourapp.expense.dao;

import java.sql.*;

/**
 * 数据库连接管理类（单例模式）
 * 负责管理与 MySQL 数据库的连接（现改为 MySQL + JDBC）
 *
 * @author YourName
 * @version 1.0
 * @since 2024
 */

public class DatabaseConnection {
  // 静态变量，用于保存唯一的实例（单例模式的核心）
  private static DatabaseConnection instance;
  // 数据库连接对象，用于执行SQL操作
  private Connection connection;

  // ============================
  // ✅ 修改 1：数据库连接配置（改成 MySQL 的 URL 和驱动）
  // 现改为 MySQL + JDBC 驱动
  // ============================

  // MySQL 用户名（根据你的实际 MySQL 用户修改，比如 root）
  private static final String USERNAME = "root";  // 👈 修改 2：建议改为你的 MySQL 用户名，比如 root

  // MySQL 密码（根据你的实际密码修改，比如 123456 或空字符串）
  private static final String PASSWORD = "199812";  // 👈 修改 3：建议改为你的 MySQL 密码

  // ✅ 修改 4：MySQL JDBC URL 格式（标准 JDBC，不再是 jTDS）
  // 格式：jdbc:mysql://<host>:<port>/<database>?参数
  // 例如：jdbc:mysql://localhost:3306/PersonalExpenseDB?useSSL=false&serverTimezone=UTC
  private static final String URL = "jdbc:mysql://localhost:3306/PersonalExpenseDB" +
      "?useSSL=false" +                    // 推荐关闭 SSL（本地开发可禁用）
      "&serverTimezone=UTC";               // 必须指定时区，否则可能报错

  // ✅ 修改 5：MySQL 的 JDBC 驱动类名（不是 JTDS，是 MySQL 官方驱动）
  private static final String DRIVER_CLASS = "com.mysql.cj.jdbc.Driver";  // 👈 修改 6

  // 私有构造方法：初始化时建立数据库连接
  private DatabaseConnection() {
    try {
      // ✅ 修改 7：加载 MySQL 的 JDBC 驱动，不是 JTDS 的驱动
      Class.forName(DRIVER_CLASS);

      // ✅ 修改 8：使用 MySQL 的 URL、用户名和密码建立连接
      this.connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
      System.out.println("✅ MySQL 数据库连接成功建立");
    } catch (Exception e) {
      // 打印错误信息（调试用）
      System.err.println("❌ MySQL 数据库连接失败: " + e.getMessage());
      e.printStackTrace();  // 建议打印堆栈，便于排查问题
    }
  }

  /**
   * 获取单例实例（线程安全，通过 synchronized 保证）
   * 这是获取 DatabaseConnection 对象的唯一入口
   *
   * @return 返回唯一的 DatabaseConnection 实例
   */
  public static synchronized DatabaseConnection getInstance() {
    if (instance == null) {
      instance = new DatabaseConnection();
    }
    return instance;
  }

  /**
   * 获取数据库连接（如果当前连接已关闭，则尝试重新连接）
   *
   * @return 返回有效的数据库连接对象
   */
  public Connection getConnection() {
    try {
      if (connection == null || connection.isClosed()) {
        // 如果连接失效，重新连接
        connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
      }
    } catch (SQLException e) {
      System.err.println("❌ 重新建立数据库连接失败: " + e.getMessage());
    }
    return connection;
  }

  /**
   * 主动关闭数据库连接（释放资源）
   */
  public void closeConnection() {
    try {
      if (connection != null && !connection.isClosed()) {
        connection.close();
        System.out.println("✅ MySQL 数据库连接已关闭");
      }
    } catch (SQLException e) {
      System.err.println("❌ 关闭数据库连接时出错: " + e.getMessage());
    }
  }


}